package util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @author cxt
 * @date 2020/8/27
 * <p>
 * 给前端产生一个条形码
 * 导入jar包
 * <dependency>
 *      <groupId>com.google.zxing</groupId>
 *      <artifactId>javase</artifactId>
 *      <version>3.3.3</version>
 * </dependency>
 */
public class BarCode {

    /**
     * 产生条形码的方法
     *
     * @param number 编码
     * @param width  宽度
     * @param height 高度
     */
    public static BufferedImage getBarCode(String number, Integer width, Integer height) {
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(number, BarcodeFormat.CODE_128, width, height);
            return MatrixToImageWriter.toBufferedImage(bitMatrix);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 给前端产生一个条形码，以 base64 码的方式返回
     *
     * @param number 编码
     * @param width  宽度
     * @param height 高度
     */
    public static String getCode(String number, Integer width, Integer height) {
        // 生成条形码
        BufferedImage image = getBarCode(number, width, height);
        // 使用流的方式
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 将流转成数组
        byte[] bytes = out.toByteArray();
        BASE64Encoder encoder = new BASE64Encoder();
        // 把生成的编码返回去
        return "data:image/png;base64," + encoder.encodeBuffer(bytes).trim();
    }

    /**
     * 输出二维码方式：本地文件的方式
     *
     * @param number   编码
     * @param width    宽度
     * @param height   高度
     * @param filePath 条形码文件的地址和名字
     */
    public static void localFile(String number, Integer width, Integer height, String filePath) throws IOException {
        BufferedImage bufImg = getBarCode(number, width, height);
        OutputStream os = new FileOutputStream(filePath);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
        encoder.encode(bufImg);
    }

    /**
     * 调用测试
     */
    public static void main(String[] args) throws IOException {
        // 编码的方式产生
        String code = getCode("1120220202", 150, 150);
        System.out.println(code);

        // 本地文件的方式
        localFile("1120220202", 150, 150, "E:\\erCode.png");
    }
}
